package com.ylbh.modules.goods.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ylbh.common.pojo.goods.dto.SpecIficationDTO;
import com.ylbh.common.pojo.goods.dto.SpecPropertyDTO;
import com.ylbh.common.pojo.goods.dto.SpecsDTO;
import com.ylbh.common.pojo.goods.vo.SpecIficationVO;
import com.ylbh.common.pojo.goods.vo.SpecPropertyVO;
import com.ylbh.common.utils.PageDTO;
import com.ylbh.common.utils.PageUtils;
import com.ylbh.common.utils.ReplaceSpecsEnum;
import com.ylbh.modules.goods.mapper.GoodsSpecMapper;
import com.ylbh.modules.goods.service.GoodsSpecService;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;

/**
 * 商品规格
 * @author mgh
 */
@Service
public class GoodsSpecServiceImpl  implements GoodsSpecService {
    @Autowired
    private GoodsSpecMapper goodsSpecMapper;

    @Override
    public String sortOutSku(String sku) {
        if(StringUtils.isNotBlank(sku)){
            JSONArray objects = JSON.parseArray(sku);
            for (int i = 0 ; i < objects.size();i++){
                JSONObject jsonObject = objects.getJSONObject(i);
                String id = jsonObject.getString("id");
                String[]  idArray= id.split("_");
                List<SpecsDTO> specsDTOS = goodsSpecMapper.selectSpecsById(idArray);

                StringBuilder val = new StringBuilder();
                for (SpecsDTO specsDTO:specsDTOS){
                    val.append(specsDTO.getParName()).append(" : ").append(specsDTO.getValue()).append(";");
                }
                jsonObject.put("specs",val.toString());
            }
            return objects.toJSONString();
        }
        return null;
    }

    /**
     * 通过分类id获取分类对应的规格数据
     * @param gcId
     * @return
     */
    @Override
    public List<SpecIficationVO> querySpecsList(Integer gcId) {
        List<SpecIficationVO> specIficationVOS = goodsSpecMapper.selectSpecsList(gcId);
        for(int i = 0;i<specIficationVOS.size();i++){
            SpecIficationVO vo = specIficationVOS.get(i);
            Integer newId = ReplaceSpecsEnum.getNewId(vo.getId());
            if(newId!=null){
                specIficationVOS.remove(i);
                i--;
            }
        }
        return specIficationVOS;
    }

    /**
     * 添加自定义规格
     * @param specIficationDTO
     * @return
     */
    @Override
    public SpecIficationDTO addCustomSpecs(SpecIficationDTO specIficationDTO) {
        // 去重规格属性
        specIficationDTO.setProperty(
            specIficationDTO.getProperty().stream() .collect(
                Collectors.collectingAndThen(
                    Collectors.toCollection(() -> new TreeSet<SpecPropertyDTO>(Comparator.comparing(SpecPropertyDTO::getName))), ArrayList::new)
            )
        );
        specIficationDTO.setAddTime(new Date());
        // 更新或插入规格
        goodsSpecMapper.insertOrUpdateIfication(specIficationDTO);

        //插入规格
        specIficationDTO.getProperty().forEach((SpecPropertyDTO specPropertyDTO) -> {
            specPropertyDTO.setSpecId(specIficationDTO.getId());
            goodsSpecMapper.insertProperty(specPropertyDTO);
        });
        return specIficationDTO;
    }

    /**
     * 通过属性查询自定义规格
     * @param id
     * @return
     */
    @Override
    public SpecIficationVO getCustomSpecs(Long id) {
        return goodsSpecMapper.getCustomSpecs(id);
    }

    /**
     * 商品规格信息列表
     * @param pageDTO
     * @return
     */
    @Override
    public PageUtils queryGoodsIficationList(PageDTO pageDTO) {
        pageDTO.setPage((pageDTO.getPage()-1 )* pageDTO.getLimit());
        List<SpecIficationVO> specIficationVOS = goodsSpecMapper.queryGoodsIficationList(pageDTO);
        Integer goodsIficationCount = goodsSpecMapper.getGoodsIficationCount(pageDTO);
        return new PageUtils(specIficationVOS,goodsIficationCount,pageDTO.getLimit(),pageDTO.getPage());
    }

    /**
     * 新增商品规格
     * @param specIficationDTO
     */
    @Override
    public void add(SpecIficationDTO specIficationDTO) {
        goodsSpecMapper.insertIfication(specIficationDTO);
    }

    /**
     * 修改商品规格
     * @param specIficationDTO
     */
    @Override
    public void modifyById(SpecIficationDTO specIficationDTO) {
        goodsSpecMapper.modifyById(specIficationDTO);
    }

    /**
     * 查询规格属性
     * @param ificationId
     * @return
     */
    @Override
    public List<SpecPropertyVO> queryPropertyByIficationIdList(Integer ificationId) {
        return goodsSpecMapper.queryPropertyByIficationIdList(ificationId);
    }

    @Override
    public void addProperty(SpecPropertyDTO specPropertyDTO) {
        goodsSpecMapper.insertProperty(specPropertyDTO);
    }

    @Override
    public void modifyPropertyById(SpecPropertyDTO specPropertyDTO) {
        goodsSpecMapper.updatePropertyById(specPropertyDTO);
    }

    /**
     * 根据候鸟的规格名去查询数据库中是否存在该规格
     * @param specDesc
     * @return
     */
    @Override
    public List<Integer> getIsExistenceByName(String specDesc) {
        return goodsSpecMapper.selectExistenceByName(specDesc);
    }

    /**
     * 根据规格名新增规格
     * @param dto
     * @return
     */
    @Override
    public int addSpec(SpecPropertyDTO dto, Date date) {
        return goodsSpecMapper.insertSpec(dto, date);
    }

    /**
     * 插入商品id与规格和的中间表信息
     * @param specId
     * @param id
     */
    @Override
    public void addGoodsIdOrSpecId(Integer specId, Long id) {
        goodsSpecMapper.insertGoodsIdOrSpecId(specId, id);
    }

    /**
     * 如果插入都没有返回id就去查(候鸟)
     * @param spdto
     * @return
     */
    @Override
    public SpecPropertyDTO selectSpecIdByName(SpecPropertyDTO spdto) {
        return goodsSpecMapper.selectSpecIdByName(spdto);
    }

    /**
     * 根据商品id查询轮播图id
     * @param id
     * @return
     */
    @Override
    public List<Long> selectPhotoIdByGoodsId(Long id) {
        return goodsSpecMapper.selectPhotoIdByGoodsId(id);
    }

    /**
     * 根据规格的属性和值查询值id
     * @param name
     * @param val
     * @return
     */
    @Override
    public List<Integer> getIsExistenceByNameAndVal(String name, String val) {
        return goodsSpecMapper.selectIsExistenceByNameAndVal(name, val);
    }

    /**
     * shopping_goodsspecification表中查询是否有这个值
     * @param name
     * @return
     */
    @Override
    public List<Integer> getGoodsSpecificationByName(String name) {
        return goodsSpecMapper.selectGoodsSpecificationByName(name);
    }

    /**
     * 新增规格属性
     * @param spdto
     * @return
     */
    @Override
    public int addGoodsSpecification(SpecPropertyDTO spdto) {
        return goodsSpecMapper.insertGoodsSpecification(spdto);
    }
}
